'use strict';

/**
 * DB操作异常类（DB异常的基类）
 */
class DBError extends Error {
    /**
     * DB操作异常类构造函数
     * 
     * @param {string}functionName 异常发生场所的函数名
     * @param {Error}originalError 原始异常
     * @param {string}operationType DB操作类型
     */
    constructor(functionName, originalError, operationType) {
        super();
        this.functionName = functionName;
        this.originalError = originalError;
        this.operationType = operationType;
        this.message = `[>>>>>>>>>>DBError<<<<<<<<<<]
            functionName:${functionName},
            originalError:${originalError ? JSON.stringify(originalError.message) : null},
            operationType:${operationType}`;
    }
}

/**
 * DB插入异常类
 */
class DBInsertError extends DBError {
    /**
     * DB插入异常类构造函数
     * 
     * @param {string}functionName 异常发生场所的函数名
     * @param {Object}insertData 插入的数据
     * @param {Error}originalError 原始异常
     */
    constructor(functionName, insertData, originalError) {
        super(functionName, originalError, 'Insert');
        this.insertData = insertData;
        this.message += `
            insertData:${JSON.stringify(insertData)}`;
    }
}

/**
 * DB删除异常类
 */
class DBDeleteError extends DBError {
    /**
     * DB删除异常类构造函数
     * 
     * @param {string}functionName 异常发生场所的函数名
     * @param {Object}deleteCondition 删除条件
     * @param {Error}originalError 原始异常
     */
    constructor(functionName, deleteCondition, originalError) {
        super(functionName, originalError, 'Delete');
        this.deleteCondition = deleteCondition;
        this.message += `
            deleteCondition:${JSON.stringify(deleteCondition)}`;
    }
}

/**
 * DB更新异常类
 */
class DBUpdateError extends DBError {
    /**
     * DB更新异常类构造函数
     * 
     * @param {string}functionName 异常发生场所的函数名
     * @param {Object}updateCondition 更新条件
     * @param {Object}updateData 更新的数据
     * @param {Error}originalError 原始异常
     */
    constructor(functionName, updateCondition, updateData, originalError) {
        super(functionName, originalError, 'Update');
        this.updateCondition = updateCondition;
        this.updateData = updateData;
        this.message += `
            updateCondition:${JSON.stringify(updateCondition)},
            updateData:${JSON.stringify(updateData)}`;
    }
}

/**
 * DB检索异常类
 */
class DBSearchError extends DBError {
    /**
     * DB检索异常类构造函数
     * 
     * @param {string}functionName 异常发生场所的函数名
     * @param {Object}searchCondition 检索条件
     * @param {Error}originalError 原始异常
     */
    constructor(functionName, searchCondition, originalError) {
        super(functionName, searchCondition, 'Search');
        this.searchCondition = searchCondition;
        this.message += `
            searchCondition:${JSON.stringify(searchCondition)}`;
    }
}

exports.DBInsertError = DBInsertError;
exports.DBDeleteError = DBDeleteError;
exports.DBUpdateError = DBUpdateError;
exports.DBSearchError = DBSearchError;